#include"pthread.hpp"
#include"mutex.hpp"
#include"block_queue.hpp"
#include<vector>
#include<functional>
#include"log.hpp"
#include"pthread_pool.hpp"

void func1(){
    std::cout<<"下载任务"<<std::endl;
}
void func2(){
    std::cout<<"上传任务"<<std::endl;
}
void func3(){
    std::cout<<"处理任务"<<std::endl;
}
void func4(){
    std::cout<<"更新任务"<<std::endl;
}
typedef std::function<void(void)> task_func;
ly::BlockQueue<task_func> lock_queue(5);
std::vector<task_func> tasks;
void* producer_func(void* arg){
    while(true){
        int i=rand()%4;
        lock_queue.push(tasks[i]);
        sleep(2);
    }
}
void* consumers_func(void* arg){
    while(true){
        int i=rand()%4;
        task_func task=lock_queue.pop();
        task();
        sleep(1);
    }
}
void* func5(void* arg){
    std::cout<<"下载任务"<<std::endl;
    return nullptr;
}
void* func6(void* arg){
    std::cout<<"上传任务"<<std::endl;
    return nullptr;
}
void* func7(void* arg){
    std::cout<<"处理任务"<<std::endl;
    return nullptr;
}
void* func8(void* arg){
    std::cout<<"更新任务"<<std::endl;
    return nullptr;
}
int main(){
    LOG(ly::LogLevel::DEBUG)<<"ssss";
    // std::cout<<__LINE__<<std::endl;
    // ENABLE_FILE_LOG_STRATEGY;
    // LOG(ly::LogLevel::DEBUG)<<"aaaa";
    ly::BlockQueue<ly::Data> block_queue(4);
    ly::PthreadPool<int> pool;
    pool.set_queue(&block_queue);
    pool.start();
    sleep(1);
    pool.push(func5);
    pool.push(func6);
    pool.push(func7);
    pool.push(func8);
    sleep(4);
    pool.stop();
    return 0;
}
// int main(){
//     srand(time(NULL));
//     tasks.push_back(func1);
//     tasks.push_back(func2);
//     tasks.push_back(func3);
//     tasks.push_back(func4);
//     //ly::Mutex mutex;
//     //ly::LockGuard Lock(mutex);
//     std::vector<ly::pthread<int>> producers(5,ly::pthread<int>(producer_func,&tasks));
//     for(int i=0;i<producers.size();i++){
//         producers[i].start();
//     }
//     std::vector<ly::pthread<int>> consumers(5,ly::pthread<int>(consumers_func));
//     for(int i=0;i<consumers.size();i++){
//         consumers[i].start();
//     }
//     sleep(10);
//     //jion threads
//     // for(int i=0;i<producers.size();i++){
//     //     producers[i].join();
//     // }
//     // for(int i=0;i<consumers.size();i++){
//     //     consumers[i].join();
//     // }
//     return 0;
// }
// void* thread_fuc(void* arg){
//     int *p=new int(0);
//     std::vector<int>& vec=*((std::vector<int>*)arg);
//     int ans=0;
//     for(int i=0;i<vec.size();i++){
//         ans+=vec[i];
//     }
//     *p=ans;
//     return (void*)p;
// }
// int ticket = 100;
// ly::Mutex mutex;
// void *route(void *arg){
//     char *id = (char *)arg;
//     while (1){
//         ly::LockGuard Lock(mutex);
//         if (ticket > 0){
//             usleep(1000);
//             printf("%s sells ticket:%d\n", id, ticket);
//             ticket--;
//         }
//         else{
//             break;
//         }
//     }
//     return NULL;
// }
// int main(void){
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, NULL, route, (void *)"thread 1");
//     pthread_create(&t2, NULL, route, (void *)"thread 2");
//     pthread_create(&t3, NULL, route, (void *)"thread 3");
//     pthread_create(&t4, NULL, route, (void *)"thread 4");
//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);
//     pthread_join(t3, NULL);
//     pthread_join(t4, NULL);
// }

// int main(){
//     std::vector<int> vec={1,2,3,4,5};
//     ly::pthread<int> t(thread_fuc,(void*)&vec);
//     t.start();
//     int *p;
//     //t.detach();
//     if(t.is_detached()){
//         std::cout<<"Thread detached"<<std::endl;
//     }
//     p=(int*)t.join();
//     std::cout<<*p<<std::endl;

//     return 0;
// }